#ifndef __MEMORY_H_
#define __MEMORY_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <common.h>
#include <list.h>


/************************* fixed memory start ********************************/

// FM -- fixed memory: 定长内存

// 定长内存分配单元长度
#define FM_ALLOC_SIZE       32
#define FM_NODE_SIZE        sizeof(FM_NODE)

// 定长内存分配单元
typedef U08 (FM_UNIT)[FM_ALLOC_SIZE];

typedef union _FM_NODE    FM_NODE;

// 定长内存管理单元，使用 union 是为了尽量少的使用内存，其实应该使用 struct 
union _FM_NODE
{
    FM_NODE*        next;           // 指向下一个节点
    FM_UNIT*        unit;           // 指向分配单元
};

// 定长内存管理链表头类型
typedef struct FM_LIST
{
    FM_NODE*        node;           // 管理单元节点
    FM_NODE*        nbase;          // 管理单元基址
    FM_UNIT*        ubase;          // 分配单元基址
    U32             max;            // 最多可分配的空闲单元个数
} FM_LIST;

extern FM_LIST  FM_LIST_HEAD;       // 定长内存管理链表头

/******************************************************************************
* 函数名称: E_RET FixedMemInit(U08* mem, U32 size)
* 功能说明: 定长内存管理初始化
* 输入参数: U08* mem        --定长内存基址
    　　　　U32 size        --定长内存长度
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 以管理单元为节点，将管理单元组织成单向链表
******************************************************************************/
E_RET FixedMemInit(U08* mem, U32 size);

/******************************************************************************
* 函数名称: void* FixedMemAlloc(void)
* 功能说明: 定长内存申请
* 输入参数: 无
* 输出参数: 无
* 函数返回: void*           --申请到的分配单元地址
* 其它说明: FM_LIST_HEAD 链表中所有节点（管理单元）都是可用的
           申请时只要将第一个节点（管理单元）所对应的分配单元地址返回，并将该节点从链表中删除即可
******************************************************************************/
void* FixedMemAlloc(void);

/******************************************************************************
* 函数名称: E_RET FixedMemFree(void* ptr)
* 功能说明: 定长内存释放
* 输入参数: void* ptr       --要释放的分配单元地址
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 根据传入的分配单元地址 ptr，计算出对应的管理单元，将其加入到 FM_LIST_HEAD 链表中
******************************************************************************/
E_RET FixedMemFree(void* ptr);

/*************************** fixed memory end ********************************/


/************************* volatile memory start *****************************/

// VM -- volatile memory: 变长内存

// 变长内存管理头类型
typedef struct VM_HEAD
{
    LIST_NODE       node;               // 链表节点
    U32             usedSize;           // 已分配内存空间大小
    U32             freeSize;           // 空闲内存空间大小
} VM_HEAD;

#define VM_HEAD_SIZE        sizeof(VM_HEAD)


/******************************************************************************
* 函数名称: E_RET VolatileMemInit(U08* mem, U32 size)
* 功能说明: 变长内存管理初始化
* 输入参数: U08* mem        --变长内存基址
    　　　　U32 size        --变长内存长度
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 
******************************************************************************/
E_RET VolatileMemInit(U08* mem, U32 size);

/******************************************************************************
* 函数名称: VolatileMemAlloc(U32 size)
* 功能说明: 变长内存申请
* 输入参数: U32 size        --要申请的内存大小
* 输出参数: 无
* 函数返回: void*           --申请到的内存首地址
* 其它说明: 
******************************************************************************/
void* VolatileMemAlloc(U32 size);

/******************************************************************************
* 函数名称: E_RET VolatileMemFree(void* ptr)
* 功能说明: 变长内存释放
* 输入参数: void* ptr       --要释放的内存首地址
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 
******************************************************************************/
E_RET VolatileMemFree(void* ptr);

/************************** volatile memory end ******************************/


#ifdef __cplusplus
}
#endif

#endif

